{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# tensorflow2教程-CNN变体网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0-alpha0\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "from tensorflow.keras import layers\n",
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.载入数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 28, 28, 1)   (60000,)\n",
      "(10000, 28, 28, 1)   (10000,)\n"
     ]
    }
   ],
   "source": [
    "(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()\n",
    "x_train = x_train.reshape((-1,28,28,1))\n",
    "x_test = x_test.reshape((-1,28,28,1))\n",
    "print(x_train.shape, ' ', y_train.shape)\n",
    "print(x_test.shape, ' ', y_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.简单的深度网络\n",
    "如AlexNet,VggNet\n",
    "![](http://www.hirokatsukataoka.net/research/cnnfeatureevaluation/cnnarchitecture.jpg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_shape  = x_train.shape\n",
    "deep_model = keras.Sequential(\n",
    "[\n",
    "    layers.Conv2D(input_shape=((x_shape[1], x_shape[2], x_shape[3])),\n",
    "                 filters=32, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'),\n",
    "    layers.Conv2D(filters=32, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'),\n",
    "    layers.MaxPool2D(pool_size=(2,2)),\n",
    "    layers.Conv2D(filters=32, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'),\n",
    "    layers.Conv2D(filters=32, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'),\n",
    "    layers.MaxPool2D(pool_size=(2,2)),\n",
    "    layers.Flatten(),\n",
    "    layers.Dense(32, activation='relu'),\n",
    "    layers.Dense(10, activation='softmax')\n",
    "    \n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d (Conv2D)              (None, 28, 28, 32)        320       \n",
      "_________________________________________________________________\n",
      "conv2d_1 (Conv2D)            (None, 28, 28, 32)        9248      \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 14, 14, 32)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 14, 14, 32)        9248      \n",
      "_________________________________________________________________\n",
      "conv2d_3 (Conv2D)            (None, 14, 14, 32)        9248      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 7, 7, 32)          0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 1568)              0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 32)                50208     \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                330       \n",
      "=================================================================\n",
      "Total params: 78,602\n",
      "Trainable params: 78,602\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "deep_model.compile(optimizer=keras.optimizers.Adam(),\n",
    "             loss=keras.losses.SparseCategoricalCrossentropy(),\n",
    "            metrics=['accuracy'])\n",
    "deep_model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 54000 samples, validate on 6000 samples\n",
      "Epoch 1/5\n",
      "54000/54000 [==============================] - 72s 1ms/sample - loss: 0.2774 - accuracy: 0.9280 - val_loss: 0.0612 - val_accuracy: 0.9822\n",
      "Epoch 2/5\n",
      "54000/54000 [==============================] - 73s 1ms/sample - loss: 0.0646 - accuracy: 0.9802 - val_loss: 0.0516 - val_accuracy: 0.9850\n",
      "Epoch 3/5\n",
      "54000/54000 [==============================] - 69s 1ms/sample - loss: 0.0471 - accuracy: 0.9856 - val_loss: 0.0466 - val_accuracy: 0.9883\n",
      "Epoch 4/5\n",
      "54000/54000 [==============================] - 70s 1ms/sample - loss: 0.0385 - accuracy: 0.9879 - val_loss: 0.0614 - val_accuracy: 0.9843\n",
      "Epoch 5/5\n",
      "54000/54000 [==============================] - 69s 1ms/sample - loss: 0.0317 - accuracy: 0.9897 - val_loss: 0.0463 - val_accuracy: 0.9867\n"
     ]
    }
   ],
   "source": [
    "history = deep_model.fit(x_train, y_train, batch_size=64, epochs=5, validation_split=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 2s 219us/sample - loss: 0.0445 - accuracy: 0.9863\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.04454196666887728, 0.9863]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "deep_model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD8CAYAAACb4nSYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl8leWd9/HPL3tCEhKSsCVkQVGJiiwRUQTRaTu44TpWrI7aKvPUOtqZOh2ctrYy9anT0nk6re1jQbHVupSitdoH646A4hJW2cUQyAIkkAQSsie/54/7TnISAjkxyVl/79frvHLnPtc558oN53uuc93X+R1RVYwxxoSHCH93wBhjjO9Y6BtjTBix0DfGmDBioW+MMWHEQt8YY8KIhb4xxoQRC31jjAkjFvrGGBNGLPSNMSaMRPm7Az2lp6drbm6uv7thjDFBZf369YdVNaOvdgEX+rm5uRQWFvq7G8YYE1REZJ837Wx6xxhjwoiFvjHGhBELfWOMCSMBN6ffm5aWFkpLS2lsbPR3V0JCXFwcWVlZREdH+7srxhgf8yr0RWQu8D9AJPCEqj7a4/ocYBmQAVQBt6pqqXvdfwFXuk3/U1X/2N9OlpaWkpSURG5uLiLS35sbD6rKkSNHKC0tJS8vz9/dMcb4WJ/TOyISCfwauBzIB+aLSH6PZouBp1V1ErAI+Il72yuBqcBk4ALgARFJ7m8nGxsbSUtLs8AfBCJCWlqavWsyJkx5M6c/HdijqkWq2gy8AFzTo00+8I67/a7H9fnAalVtVdXjwBZg7hfpqAX+4LFjaUz48mZ6JxMo8fi9FGfU7mkzcD3OFNB1QJKIpLn7fygiPwcSgEuB7T0fQEQWAAsAsrOz+/knGGNM8Ghpa6e6vpnq4y1U1zdTU99MlbudmhDDLRcMbQYO1oncB4DHROQOYDVQBrSp6hsicj7wAVAJrAPaet5YVZcASwAKCgoC8kt7a2pqeO6557jnnnv6dbsrrriC5557jpSUlJO2eeihh5g9ezZf+tKXBtpNY4wPNba0UV3fTNXxZmrqW9wwb6a6t+36ZmqOt1Db1HrS+5uanRIQoV8GjPP4Pcvd10lVy3FG+ohIInCDqta41z0CPOJe9xywe+Dd9r2amhp+85vfnBD6ra2tREWd/DCuXLmyz/tetGjRgPtnjPniVJXjzW1Uu+Fd1TkCd0K7xiPYnZ/O/oaWE8awnZJio0gZFs2IhBhSE2IYnz6M1GHOdmpCtMd2DKnDoklNiCEuOnLI/1ZvQv8TYIKI5OGE/c3ALZ4NRCQdqFLVduBBnJU8HSeBU1T1iIhMAiYBbwxi/31m4cKFfP7550yePJno6Gji4uJITU1l586d7N69m2uvvZaSkhIaGxu5//77WbBgAdBVVqKuro7LL7+ciy++mA8++IDMzEz+8pe/EB8fzx133MFVV13FjTfeSG5uLrfffjuvvvoqLS0t/OlPf+Kss86isrKSW265hfLyci688ELefPNN1q9fT3p6up+PjDGBpb1dqW1s7Rxde06lVLth7YzAPadYWmhua+/1/kRgeHx0Z1iPGR7HxDHJjBgWTUpCDCOGOfs7tlMSokmJjyEmKjA/BtVn6Ktqq4jcC7yOs2RzmapuE5FFQKGqvgLMAX4iIoozvfMt9+bRwBr3xOExnKWcJ39v44WHX93G9vJjA7mLE+SPTeaHV599yjaPPvooW7duZdOmTaxatYorr7ySrVu3di57XLZsGSNGjKChoYHzzz+fG264gbS0tG738dlnn/H888+zdOlSbrrpJl588UVuvfXWEx4rPT2dDRs28Jvf/IbFixfzxBNP8PDDD3PZZZfx4IMP8re//Y0nn3xy8A6A6VvjMaguhthESMmFiMB8QoeatnbtHFV3G217TJd0jMo7wrymoYW29t5niSMjpCugE2LISUtg8rgUd9Qd3etIfHh8NJERobP4was5fVVdCazsse8hj+0VwIpebteIs4In5EyfPr3bOvdf/vKX/PnPfwagpKSEzz777ITQz8vLY/LkyQBMmzaN4uLiXu/7+uuv72zz0ksvAbB27drO+587dy6pqamD+vcYoKEaqoqgaq/70+NyvLKrXVQ8ZJwBGRNh5FkwMh8yzoLh4+zF4BSaW9u7wrmvuW93GuVYYwt6krN8MZERndMiqQkxnDEqsTPMUxKi3RF413ZKQgzJcVFhv3otKD6R66mvEbmvDBs2rHN71apVvPXWW6xbt46EhATmzJnT6zr42NjYzu3IyEgaGhp6ve+OdpGRkbS2DuiNkfGkCvVHTgz0jktDdff2yVkwIg/OvBxGjIfUXGiqhYodzmXve7Dlha720cMg40wYOdF5ERiZ77woJGc6cwQhqLGljcraJipqm6isbaSitomKY01U1DZSWdvEEY9plLpTnMBMiInsFtBZqQmMcEfkJ5v/ToiJDPsA/yKCLvT9JSkpidra2l6vO3r0KKmpqSQkJLBz504+/PDDQX/8mTNnsnz5cv793/+dN954g+rq6r5vFI5UofYgVPcyWq/aC00eU4MS4YzOR4yHs693fnZcUnMgOr7vx2uohspdXS8ElTvgszdh07NdbWKTnReDjLO6vyAkjQ7YF4O6plYqjrkhXttExbHGznCvqG10g72Jow0tJ9w2MkJIT4whIymWtGGxnJaR2DllkjIsxj2x2X0O3BcnMI3DQt9LaWlpzJw5k3POOYf4+HhGjRrVed3cuXN5/PHHmThxImeeeSYzZswY9Mf/4Q9/yPz583nmmWe48MILGT16NElJSYP+OEGhvR2OlfUe6tV7oaW+q21EFKTkOEE+bkb3YE/JhqiYgfUlPhWyZzgXT/VVXS8CFTugYifsWgkbn+lqEze8a4rIc6poWMaQvBioKtX1LW54dwV3hTtCrzzWtV3ffOKqlJioCEYmxTIyyQnyC09Lc3+PIyM5tnN7xLCYkJoDDzWiJ5sw85OCggLt+SUqO3bsYOLEiX7qUWBoamoiMjKSqKgo1q1bxze/+U02bdr0he8v4I9pWyscLeke6B3b1cXQ1tTVNjLWmXrpDPS8ru3h4yAygMY2dZXuC8FOqNgOlTudF4XGmq428SM83hFMdLcnwrC0Xu+yta2dI8ebO6dVPKdYOkbqlccaqaxroqXtxOd7YmwUI5NiyUiKZWRyXGewj0x2QrwjzJPjbT48kInIelUt6KtdAD0bzKns37+fm266ifb2dmJiYli6dKm/uzRwrc1Qs7/3+fWafdDuMQccneCEeMYZcObc7iP2pLHBcwI1McO55M3u2qcKdYfcdwY7O6eK9NPlSFPXlGJDzAgq4/IoicphD1lsbR7L+obRFNfH0NtildSEaCe0k2M5LSOtK8A9wzw5loQYi4Ehp+qcD6o7BLUHoPYQ1B10piLrDjk/aw9C2ulwywt9398A2L92kJgwYQIbN270dzf6r6XBGZn3FuxHS0E91kbHJEHaeBgzCc6+tnuwJ44K2Pnv/lBVZ768tqlrjrxzvjyVitopVBzLd+fLmxlNFWdElDJBSjmjtYwzG0uYHLGNmXQtFKhLTKc2+XSaR5yBjJxIfOY5DM8+l5hEW+E15FSd8zq1B90QP9T1s/ZAV6DXHeo+7dghKh6SRkHiaBiVD6MnDXmXLfTNwDXV9XLi1P39WFn3tvGp7vz6BXDe/O7BnpAWtMHeMV9+wlz5saauOXR32qW3T3H2a75ccKa+KnZC5Q4SK3aSWLEdilfAZx7BkpzZ4+TxROeEcmyYngvqj/Z2qD/cfSTeMTLv3HfI+ek51dghJqkrzDOnQtIYZ+CSNLr7z7jhPv8/b6FvvNNQ0yPYPbbrDnVvO2ykE+J5l/SYY89zQj8I1TW1srmkhv1V9V94vnxSVsrgzZenZDuXM77Sta+93ZkW65giqnTPG3zyPrR6LCEenu2ePPZ4Qcg4E2KGnfg4oaatFY5XnDit0nOUfryi+/Rih7gUJ7CTRkPORV3B3vnTvQTwsbTQN46Ot6knW8Nef6R7+6SxTpBP+Er30fqIvKAfSaoqJVUNrN9fxfp91azfV8Oug8e6zZsH5Hx5RIT7Aut+tqBDe5szxda5mmin84JQtAramt1G4ixT7bmaKP0M75au+ltrk8fo++BJwvwgHD8M9HICJCHdGY0njYKRZ58Y4omjnEt0nM//tMFmoR9O2tugrcV5ojfVwduLPEbse6HpqEdjcdew58HEeT3WsOdCTIK//opB19jSxtayo6zfV82G/U7IH65z3rInxkYxJTuFr1w2gak5qZw+MpGMxNiAravSq4hISDvNuUy8qmt/W6vzb9/5QuD+3PNm1yhXIiA1r8cU0VmQPgGiYnt/vMHUXN/LtEovo/SeH6wDkEhIHOmEdXImjJ3qEeIeo/PEkRAZPl8daqE/RBITE6mrq6O8vJz77ruPFStOqFLRp02bNlFeXs4VV1wBwCuvvML27dtZuHDhiY1VnSdqW3NXsHteWptBPeaSG6rg/f9xpghGjIdx091Az+v6cJIvntR+UHGs0R3BV7N+fzVby452Ts3kpiUw+4x0puWkMi0nlQkjk0J3zXlklFtO4gzI9/hepNZmqPq8+2qiyp2w67Wu/0PivpD0PGeQdnrfAdqxkqW3kXi3MD/U/cN0HSKiu0bfaadB7sweUyzuz2Hpzgue6cbW6Q+RjtAfiN/97ncUFhby2GOPOatcuoV5S1eYd+zr+bZVIiAyxuMS3bm9Y89eJk7MD/knRWtbOzsP1rojeOdSWu2Uv4iJiuC8rOFMzUllWnYqU3NSSU8MzRe6QdHaBIc/63HOYIdzrqdjFVZEFKRN6Joiiorp/0qWk530TBrjbMenBu0J/6Fk6/QH2cKFCxk3bhzf+pZTQPRHP/oRUVFRvPvuu1RXV9PS0sKPf/xjrrmm+zdJFhcXc9VVV7F161ZmzJjBk08+ydlnO/WD5syZw+LFi2lvb+f++++jsaGB+Lg4nvq/vyBv3Gge+v73aGhsYO2qt3jwW3fQ0NhE4ZbtPPbIQopLyvn6dx7mcNVRMtLTeOo3vyA7N487vnk/ycNTKNywkYMHD/HTn/6UG2+88cQ/KCIqJAO/pr6ZjftrOkN+U0lN56dLRyXHMi0nlTsuymVaTipnjx0eXNM0/hYVC6PPcS6eWhrg8O7uU0TlG2Hby4A6ZSg6wjtzWo8Q9xidxyZbmPtA8IX+awvh4KeDe5+jz4XLHz1lk69+9at8+9vf7gz95cuX8/rrr3PfffeRnJzM4cOHmTFjBvPmzet9FUZbM1+94TqWP/t7Hn7wOxwoK+FA6X4KshM5VlPFmj/+iqioKN5a/RH/8f3v8+LSn7Po3+6hcMsOHlv8CETG8LvnX3SWeI2cyD//0w+4/e5vcfvtt7Ns2TLu+/7/5uWXX4bIGA4cqmTt2vfZuXMn8+bN6z30Q4Cq8nnlcTZ4TNXsqXDeXUVGCPljkrmpYJwzks9JZezwOPtE6VCIjocx5zkXT831gAb0SpZwFHyh7ydTpkyhoqKC8vJyKisrSU1NZfTo0fzLv/wLq1evJkKEsrIyDu3dzuj0EYC6b4X3OsvlDm3jpssm85Vb7uHhe+ez/E9/4sarvgKRMRxtieT27/yQz4r2IhJBS2ur8wQavgniDzjz6+DUco+Mgag41q37kJdeckot33bbbXz3u9/t7Ou1115LREQE+fn5HDp0qJe/JjjVN7eyueRo5yh+w/5qauqdgl/D46OZlpPKdVMymZqdynnjhtsnTf0thE72h5Lge1b0MSIfdKruqpdm/uHaq1nx7FMcPHiQr171JZ59fDGVJXtY/+oTREdHk3vBlTRWFkNcs3M7Vad8QEQUDM8ic8R40kaOYUsF/PG1NTz++OOQNp4ffGcRl355Ln++7z6Ki4uZM2fOgN7mepZwDrRzNt5SVcqPOidcO0by2w8c6/xyjAkjE/n7/NFMy3Hm4senDyMiVE+4GjOIgi/0B5tq76tdPE+WuiepvvqV6dz9b//J4aoa3vvL0yx/9U1GjhpN9Ihs3l37EftKDzirF8ZMcE6iZpwBx2Oc0B+W4dzHzfP56eKfc/ToUSZNcj5yffToUTIzMwHn5G2HU5Vzvuiii3jhhRe47bbbePbZZ5k1a9YQHqSh19zazrZyz2WT1Rw65iybTIiJZPK4FO6ZcxpTc1KZMi6FlIQBVsc0JkyFfuh7rk0/Waj3FBHlrHSJinU+aOSueDl75pnUNv2IzJzxjDn3Er425myuvvpqzr3oyxQUFHDWWWc5t5GTnxy88cYbuf/++/nBD37Que+73/0ut99+Oz/+8Y+58sorO/dfeumlPProo0yePJkHH3yw2/386le/4s477+RnP/sZGRkZPPXUUwM/Vj50uK7JGcHvd0byW0qP0tTqvLhmpcYzY3yaM4rPTuWs0UlERdoJV2MGQ+gs2Wxvcz416rkuva3H2nQApNvSxe7b7u8huKqlJ18ug21rVz6rqO1cMrlhXzXFR5wlezGREZydmcy07NTOqZpRycH/qUdjfC0Ml2yqU9zLc216zLDeQ91WcAypY40tbNpf0zlVs2l/DbXuV+WlJ8YwLSeVWy7I7lw2ad+aZIzvhE7oS6Sz9FIiLdR9SFXZd6S+c8nkhn3V7DpUiypECJw5Oplrpox1PuGaPYJxI+Jt2aQxfhQ0oa+qpw4LEZCg+XP8aiBTeo0tbXzq1qnpmKo5ctw5L5IUG8WUnFQuP2cM03KcZZNJceFT08SYYBAUKRkXF8eRI0dIS0uzUeIAqSpHjhwhLs67efODHcsm3RU128q76tSMTx/GpWeN7KxTc3pGoi2bNCbAeRX6IjIX+B8gEnhCVR/tcX0OsAzIAKqAW1W11L3up8CVQATwJnC/9nOomZWVRWlpKZWVlf25mTmJuLg4srKyTtjf0tbOzgO1rN9Xxfr9NWzYV01ZjVOnJjYqgvPGpXDXrPFMy05lSnYKaVanxpig02foi0gk8Gvgy0Ap8ImIvKKq2z2aLQaeVtXfi8hlwE+A20TkImAm0PEdYGuBS4BV/elkdHQ0eXl5/bmJ8cKxxhYKi6s6p2o2lxzt/FanMcPjmJqTyjcuzmNaTioTxyRbnRpjQoA3I/3pwB5VLQIQkReAawDP0M8H/tXdfhd42d1WIA6IAQSIBkKnLkAQO9bYwpd+/h4VtU1ERQhnj03m5unjOtfGj00Jgi/OMMb0mzehnwmUePxeClzQo81m4HqcKaDrgCQRSVPVdSLyLnAAJ/QfU9UdPR9ARBYACwCys7P7/UeY/nvh4/1U1Dbxm69N5dIzRxIfY8smjQkHg/V+/QHgEhHZiDN9Uwa0icjpwEQgC+fF4zIROaFegKouUdUCVS3IyMgYpC6Zk2lubWfZ2mIuOi2NK84dY4FvTBjxJvTLgHEev2e5+zqparmqXq+qU4DvuftqcEb9H6pqnarWAa8BFw5Kz80X9tct5Rw81sjds8f7uyvGGB/zJvQ/ASaISJ6IxAA3A694NhCRdJHOgjMP4qzkAdiP8w4gSkSicd4FnDC9Y3xHVVmyuogzRyUx5wx7V2VMuOkz9FW1FbgXeB0nsJer6jYRWSQi89xmc4BdIrIbGAU84u5fAXwOfIoz779ZVV8d3D/B9Meazw6z82Atd83Ks888GBOGvFqnr6orgZU99j3ksb0CJ+B73q4N+KcB9tEMoiWrixiVHMs1kzP93RVjjB/Ywuswsq38KGv3HOaOi/Jszb0xYcqe+WHkiTV7GRYTyS0X2LJYY8KVhX6YKK9p4NXN5dw8PZvh8VYEzZhwZaEfJp56fy8K3Dkz199dMcb4kYV+GDjW2MLzH5dw1aQxZKUm+Ls7xhg/stAPA89/tJ+6plbunmUfxjIm3Fnoh7jm1naeer+YmaencU7mcH93xxjjZxb6Ie7VzW7JBRvlG2Ow0A9pqsrSNU7JhUus5IIxBgv9kLbaLblw9+zxVnLBGANY6Ie0Jas/Z1RyLPPOG+vvrhhjAoSFfojaWnaU9/cc4c6ZVnLBGNPF0iBEPbGmiMTYKCu5YIzpxkI/BJXVNPDqlgPcfP44kuOs5IIxpouFfgh6au1eAO68OM/PPTHGBBoL/RBztKGF5z/ez9WTxpCZEu/v7hhjAoyFfoh5/uP9HG9us++/Ncb0ykI/hDglF/Zy8enpnD3WSi4YY05koR9CXtlczqFjTTbKN8aclIV+iFBVlq4u4qzRScyekO7v7hhjApSFfoh4b3cluw7VcvcsK7lgjDk5C/0QsWR1EaOT47jaSi4YY07BQj8EbC07ygefH+HOmblWcsEYc0peJYSIzBWRXSKyR0QW9nJ9joi8LSJbRGSViGS5+y8VkU0el0YRuXaw/4hwt9QtuTDfSi4YY/rQZ+iLSCTwa+ByIB+YLyL5PZotBp5W1UnAIuAnAKr6rqpOVtXJwGVAPfDGIPY/7JVW1/PXLQeYP91KLhhj+ubNSH86sEdVi1S1GXgBuKZHm3zgHXf73V6uB7gReE1V679oZ82Jnnq/GAHunGklF4wxffMm9DOBEo/fS919njYD17vb1wFJIpLWo83NwPO9PYCILBCRQhEprKys9KJLBpySCy98vJ+rzxvLWCu5YIzxwmCd9XsAuERENgKXAGVAW8eVIjIGOBd4vbcbq+oSVS1Q1YKMDPtaP28995FbcsG+/9YY46UoL9qUAeM8fs9y93VS1XLckb6IJAI3qGqNR5ObgD+rasvAums6NLW28dT7e5k1IZ38scn+7o4xJkh4M9L/BJggInkiEoMzTfOKZwMRSReRjvt6EFjW4z7mc5KpHfPFvLKpnIraJhvlG2P6pc/QV9VW4F6cqZkdwHJV3SYii0RknttsDrBLRHYDo4BHOm4vIrk47xTeG9SehzFVZekap+TCLCu5YIzpB2+md1DVlcDKHvse8theAaw4yW2LOfHErxmAVbsr2X2ojv++6TwruWCM6Rf7+GYQWvKelVwwxnwxFvpB5tPSo6wrOsLXL84lOtL++Ywx/WOpEWSWrikiKTaK+dOt5IIxpv8s9INIaXU9/+/TA8y/IJskK7lgjPkCLPSDyLK1HSUXcv3dFWNMkLLQDxJH61t44ZP9zDtvLGOGW8kFY8wXY6EfJJ79eB/1zW3cZR/GMsYMgIV+EHBKLhRbyQVjzIBZ6AeBv2wqp7K2iQWzbZRvjBkYC/0A196uLF1dxMQxyVx8upVcMMYMjIV+gHtvdyWfVdSxYHaelVwwxgyYhX6A++3qzxkzPI6rJlnJBWPMwFnoB7AtpTV8WFTF12fmWckFY8ygsCQJYEvX7CUpNoqbp4/ru7ExxnjBQj9AlVTVs/LTA9xiJReMMYPIQj9ALXt/r1tyIc/fXTHGhBAL/QB0tL6FP35SwrzJYxk9PM7f3THGhBAL/QD0h4+ckgv2/bfGmMFmoR9gmlrb+N0Hxcw+I4OJY6zkgjFmcFnoB5i/bHRLLtgo3xgzBCz0A0h7u7JkTRH5Y5KZeXqav7tjjAlBFvoBZNXuCvZU1LFg9ngruWCMGRIW+gHkt+8VMXZ4HFdOGuPvrhhjQpRXoS8ic0Vkl4jsEZGFvVyfIyJvi8gWEVklIlke12WLyBsiskNEtotI7uB1P3RsLqnho71VfP1iK7lgjBk6faaLiEQCvwYuB/KB+SKS36PZYuBpVZ0ELAJ+4nHd08DPVHUiMB2oGIyOh5ola4pIiovi5unZ/u6KMSaEeTOknA7sUdUiVW0GXgCu6dEmH3jH3X6343r3xSFKVd8EUNU6Va0flJ6HkJKqel5zSy4kxkb5uzvGmBDmTehnAiUev5e6+zxtBq53t68DkkQkDTgDqBGRl0Rko4j8zH3n0I2ILBCRQhEprKys7P9fEeSeXLuXyAjhzous5IIxZmgN1uTxA8AlIrIRuAQoA9qAKGCWe/35wHjgjp43VtUlqlqgqgUZGRmD1KXgUFPf7JRcOC/TSi4YY4acN6FfBnjW9s1y93VS1XJVvV5VpwDfc/fV4Lwr2ORODbUCLwNTB6XnIeLZj/bT0NLG3bNtlG+MGXrehP4nwAQRyRORGOBm4BXPBiKSLiId9/UgsMzjtiki0jF8vwzYPvBuh4bGljaeer+YS87I4KzRVnLBGDP0+gx9d4R+L/A6sANYrqrbRGSRiMxzm80BdonIbmAU8Ih72zacqZ23ReRTQIClg/5XBKm/bCrjcF0TC2ZbyQVjjG+Iqvq7D90UFBRoYWGhv7sx5NrblS//n/eIi47kr/98sX0C1xgzICKyXlUL+mpnnwLyk3d3VfB55XEruWCM8SkLfT/57eoiMlPiueJcK7lgjPEdC30/2FRSw8d7q7hzZq6VXDDG+JQljh8sXW0lF4wx/mGh72P7j9Tz2tYDfO2CHCu5YIzxOQt9H1v2vltyYWauv7tijAlDFvo+VH3cKblwzeRMRiVbyQVjjO9Z6PvQsx/tc0ou2PffGmP8xELfRxpb2vjdB/uYc2YGZ45O8nd3jDFhykLfR17e6JZcsFG+McaPLPR9oL1dWbKmiHMyk7nwtDR/d8cYE8Ys9H3gnZ0VFFUe5+5ZVnLBGONfFvo+sMQtuXCllVwwxviZhf4Q27i/mo+Lq/j6xXlEWckFY4yfWQoNsaVrikiOi+Kr54/ru7ExxgwxC/0htO/Icf629SBfm2ElF4wxgcFCfwgtW+uWXLgo199dMcYYwEJ/yFQfb2Z5YSnXTs5kpJVcMMYECAv9IfKHD92SC/b9t8aYAGKhPwQaW9r4/bpiLj0zgzNGWckFY0zgsNAfAn/eWMbhumYb5RtjAo6F/iBrb1eWrini3MzhXDjeSi4YYwKLhf4ge7uj5MJsK7lgjAk8XoW+iMwVkV0iskdEFvZyfY6IvC0iW0RklYhkeVzXJiKb3Msrg9n5QLRk9edkpsRzxTmj/d0VY4w5QZ+hLyKRwK+By4F8YL6I5Pdothh4WlUnAYuAn3hc16Cqk93LvEHqd0DasL+aT4qr+YaVXDDGBChvkmk6sEdVi1S1GXgBuKZHm3zgHXf73V6uDwtLV1vJBWNMYPMm9DOBEo/fS919njYD17vb1wFJItJxFjNORApF5EMRuba3BxCRBW6bwsrKyn50P3DsO3Kcv207yK3f8tLmAAANKElEQVQzchhmJReMMQFqsOYgHgAuEZGNwCVAGdDmXpejqgXALcAvROS0njdW1SWqWqCqBRkZGYPUJd96cu1eoiMiuMNKLhhjApg3Q9IywHO+Isvd10lVy3FH+iKSCNygqjXudWXuzyIRWQVMAT4fcM8DSNXxZpYXlnDtlLFWcsEYE9C8Gel/AkwQkTwRiQFuBrqtwhGRdBHpuK8HgWXu/lQRie1oA8wEtg9W5wPFHz7cR2NLO3fb998aYwJcn6Gvqq3AvcDrwA5guapuE5FFItKxGmcOsEtEdgOjgEfc/ROBQhHZjHOC91FVDanQb2xp4/cfFHPZWSOZYCUXjDEBzqszjqq6EljZY99DHtsrgBW93O4D4NwB9jGgvbShjCPHm22Ub4wJCraYfADa25Un1hQxKWs4M8aP8Hd3jDGmTxb6A/DWjkMUHT7O3bOs5IIxJjhY6A/AktVFZKXGc7mVXDDGBAkL/S9o/b5qCvdZyQVjTHCxtPqClq4uYnh8NDcVWMkFY0zwsND/AooPH+f17Qe5dUa2lVwwxgQVC/0voKPkwu1WcsEYE2Qs9Pup6ngzf1pfwnVTMhmZZCUXjDHBxUK/n55Z55ZcmJ3n764YY0y/Wej3Q2NLG0+vK+bvzhrJ6SOt5IIxJvhY6PfDixtKnZILs63kgjEmOFnoe6mtXXlizV7OyxrOBXlWcsEYE5ws9L301o5D7D18nLtnW8kFY0zwstD30pLVRYwbEc/cs63kgjEmeFnoe2H9virW76vmGzOt5IIxJrhZgnlhSUfJhfOt5IIxJrhZ6Pdh7+HjvLH9ELfNyCEhxkouGGOCm4V+H55cW2QlF4wxIcNC/xSO1DXxp8JSrp+aSUZSrL+7Y4wxA2ahfwrPfLiPptZ27rLvvzXGhAgL/ZNoaG7j6XX7+NLEkZw+MtHf3THGmEFhoX8SL24opep4M3fbKN8YE0Is9HvhlFwo4rxxKUy3kgvGmBDiVeiLyFwR2SUie0RkYS/X54jI2yKyRURWiUhWj+uTRaRURB4brI4PpTe3H6L4SD0LZlnJBWNMaOkz9EUkEvg1cDmQD8wXkfwezRYDT6vqJGAR8JMe1/8nsHrg3fWNJas/d0ounGMlF4wxocWbkf50YI+qFqlqM/ACcE2PNvnAO+72u57Xi8g0YBTwxsC7O/TW76tiw/4a7rp4PJERNso3xoQWb0I/Eyjx+L3U3edpM3C9u30dkCQiaSISAfwceOBUDyAiC0SkUEQKKysrvev5EPnte0WkJETzDwVZfTc2xpggM1gnch8ALhGRjcAlQBnQBtwDrFTV0lPdWFWXqGqBqhZkZGQMUpf6r6iyjjd3WMkFY0zo8ibZygDPSmNZ7r5OqlqOO9IXkUTgBlWtEZELgVkicg+QCMSISJ2qnnAyOBA8uXYv0ZER/OOFuf7uijHGDAlvQv8TYIKI5OGE/c3ALZ4NRCQdqFLVduBBYBmAqn7No80dQEGgBv7huiZWrC/lBiu5YIwJYX1O76hqK3Av8DqwA1iuqttEZJGIzHObzQF2ichunJO2jwxRf4fMM+us5IIxJvSJqvq7D90UFBRoYWGhTx+zobmNix59m2k5I3ji9gKfPrYxxgwGEVmvqn0GmH0iF1ixoZTq+hYWzLZRvjEmtIV96HeUXJg8LoXzc1P93R1jjBlSYR/6b24/yL4j9SyYbSUXjDGhL6xDX1X57eoiskck8PdnW8kFY0zoC+vQX7+vmo37a7hrVp6VXDDGhIWwDv3fri4iNSGaf5g2ru/GxhgTAsI29D+vrOMtt+RCfEykv7tjjDE+Ebah31ly4aJcf3fFGGN8JixDv6vkQhbpiVZywRgTPsIy9J9et4+WtnbumpXn764YY4xPhV3oNzS38cy6Yr40cRSnZST6uzvGGONTYRf6K9aXWMkFY0zYCqvQb2tXnli7lynZKRTkWMkFY0z4CavQf2ObW3JhlpVcMMaEp7AJ/Y6SCzlpCXzFSi4YY8JU2IR+4b5qNpXUcNfFVnLBGBO+wib0f/ueU3LhRiu5YIwJY2ER+p0lFy7MtZILxpiwFhah/8SavcRGRfCPF+b4uyvGGONXIR/6lbVNvLihlBumWckFY4wJ+dB/Zl2xU3LhYiu5YIwxIR369c2tPP3hPr48cRTjreSCMcaEduivWF9KjZVcMMaYTl6FvojMFZFdIrJHRBb2cn2OiLwtIltEZJWIZHns3yAim0Rkm4j8r8H+A06mrV15Ys1epmanUJA7wlcPa4wxAa3P0BeRSODXwOVAPjBfRPJ7NFsMPK2qk4BFwE/c/QeAC1V1MnABsFBExg5W50/l9W0H2V9Vb6N8Y4zx4M1IfzqwR1WLVLUZeAG4pkebfOAdd/vdjutVtVlVm9z9sV4+3oB1lFzITUvgy/lWcsEYYzp4E8KZQInH76XuPk+bgevd7euAJBFJAxCRcSKyxb2P/1LV8oF1uW+fFFezuaSGb8wabyUXjDHGw2CNvB8ALhGRjcAlQBnQBqCqJe60z+nA7SIyqueNRWSBiBSKSGFlZeWAO7Nk9eeMGBbDjVOzBnxfxhgTSrwJ/TLAs2BNlruvk6qWq+r1qjoF+J67r6ZnG2ArMKvnA6jqElUtUNWCjIyMfv4J3e2pqOOtHRXcNiPHSi4YY0wP3oT+J8AEEckTkRjgZuAVzwYiki4iHff1ILDM3Z8lIvHudipwMbBrsDrfmyfXFlnJBWOMOYk+Q19VW4F7gdeBHcByVd0mIotEZJ7bbA6wS0R2A6OAR9z9E4GPRGQz8B6wWFU/HeS/oZNTcqGMG6dlkWYlF4wx5gRR3jRS1ZXAyh77HvLYXgGs6OV2bwKTBthHrz29zi25MMuWaRpjTG9C5hO59c2tPPPhPr6SP4q89GH+7o4xxgQkr0b6waC2sZWZp6XzdSusZowxJxUyoT8qOY5ff22qv7thjDEBLWSmd4wxxvTNQt8YY8KIhb4xxoQRC31jjAkjFvrGGBNGLPSNMSaMWOgbY0wYsdA3xpgwIqrq7z50IyKVwL4B3EU6cHiQujOYrF/9Y/3qH+tX/4Riv3JUtc/a9AEX+gMlIoWqWuDvfvRk/eof61f/WL/6J5z7ZdM7xhgTRiz0jTEmjIRi6C/xdwdOwvrVP9av/rF+9U/Y9ivk5vSNMcacXCiO9I0xxpxEUIa+iMwVkV0iskdEFvZyfayI/NG9/iMRyQ2Qft0hIpUissm93OWjfi0TkQoR2XqS60VEfun2e4uI+OSLCbzo1xwROepxvB7qrd0Q9GuciLwrIttFZJuI3N9LG58fMy/75fNjJiJxIvKxiGx2+/VwL218/pz0sl9+eU66jx0pIhtF5K+9XDd0x0tVg+oCRAKfA+OBGGAzkN+jzT3A4+72zcAfA6RfdwCP+eGYzQamAltPcv0VwGuAADOAjwKkX3OAv/rheI0BprrbScDuXv4tfX7MvOyXz4+ZewwS3e1o4CNgRo82/nhOetMvvzwn3cf+V+C53v69hvJ4BeNIfzqwR1WLVLUZeAG4pkeba4Dfu9srgL8TEQmAfvmFqq4Gqk7R5BrgaXV8CKSIyJgA6JdfqOoBVd3gbtcCO4DMHs18fsy87JfPucegzv012r30PFno8+ekl/3yCxHJAq4EnjhJkyE7XsEY+plAicfvpZz4H7+zjaq2AkeBtADoF8AN7nTAChEZN8R98pa3ffeHC92356+JyNm+fnD3bfUUnFGiJ78es1P0C/xwzNypik1ABfCmqp70ePnwOelNv8A/z8lfAN8F2k9y/ZAdr2AM/WD2KpCrqpOAN+l6JTe924Dz0fLzgF8BL/vywUUkEXgR+LaqHvPlY59KH/3yyzFT1TZVnQxkAdNF5BxfPG5fvOiXz5+TInIVUKGq64f6sXoTjKFfBni+Gme5+3ptIyJRwHDgiL/7papHVLXJ/fUJYNoQ98lb3hxTn1PVYx1vz1V1JRAtIum+eGwRicYJ1mdV9aVemvjlmPXVL38eM/cxa4B3gbk9rvLHc7LPfvnpOTkTmCcixTjTwJeJyB96tBmy4xWMof8JMEFE8kQkBuckxys92rwC3O5u3wi8o+4ZEX/2q8ec7zycOdlA8Arwj+6KlBnAUVU94O9OicjojnlMEZmO8/91yIPCfcwngR2q+t8naebzY+ZNv/xxzEQkQ0RS3O144MvAzh7NfP6c9KZf/nhOquqDqpqlqrk4OfGOqt7ao9mQHa+owbgTX1LVVhG5F3gdZ8XMMlXdJiKLgEJVfQXnifGMiOzBOVF4c4D06z4RmQe0uv26Y6j7BSAiz+Os6kgXkVLghzgntVDVx4GVOKtR9gD1wJ0B0q8bgW+KSCvQANzsgxdvcEZitwGfuvPBAP8BZHv0zR/HzJt++eOYjQF+LyKROC8yy1X1r/5+TnrZL788J3vjq+Nln8g1xpgwEozTO8YYY74gC31jjAkjFvrGGBNGLPSNMSaMWOgbY0wYsdA3xpgwYqFvjDFhxELfGGPCyP8H3kl1QcLrbEYAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'valivation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 2s 219us/sample - loss: 0.0445 - accuracy: 0.9863\n"
     ]
    }
   ],
   "source": [
    "result = deep_model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.添加了其它功能层的深度卷积"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_shape  = x_train.shape\n",
    "deep_model = keras.Sequential(\n",
    "[\n",
    "    layers.Conv2D(input_shape=((x_shape[1], x_shape[2], x_shape[3])),\n",
    "                 filters=32, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.Conv2D(filters=32, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.MaxPool2D(pool_size=(2,2)),\n",
    "    layers.Conv2D(filters=32, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.Conv2D(filters=32, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'),\n",
    "    layers.MaxPool2D(pool_size=(2,2)),\n",
    "    layers.Flatten(),\n",
    "    layers.Dense(32, activation='relu'),\n",
    "    layers.Dropout(0.2),\n",
    "    layers.Dense(10, activation='softmax')\n",
    "    \n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d_4 (Conv2D)            (None, 28, 28, 32)        320       \n",
      "_________________________________________________________________\n",
      "batch_normalization_v2 (Batc (None, 28, 28, 32)        128       \n",
      "_________________________________________________________________\n",
      "conv2d_5 (Conv2D)            (None, 28, 28, 32)        9248      \n",
      "_________________________________________________________________\n",
      "batch_normalization_v2_1 (Ba (None, 28, 28, 32)        128       \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 14, 14, 32)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_6 (Conv2D)            (None, 14, 14, 32)        9248      \n",
      "_________________________________________________________________\n",
      "batch_normalization_v2_2 (Ba (None, 14, 14, 32)        128       \n",
      "_________________________________________________________________\n",
      "batch_normalization_v2_3 (Ba (None, 14, 14, 32)        128       \n",
      "_________________________________________________________________\n",
      "conv2d_7 (Conv2D)            (None, 14, 14, 32)        9248      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_3 (MaxPooling2 (None, 7, 7, 32)          0         \n",
      "_________________________________________________________________\n",
      "flatten_1 (Flatten)          (None, 1568)              0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 32)                50208     \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            (None, 32)                0         \n",
      "_________________________________________________________________\n",
      "dense_3 (Dense)              (None, 10)                330       \n",
      "=================================================================\n",
      "Total params: 79,114\n",
      "Trainable params: 78,858\n",
      "Non-trainable params: 256\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "deep_model.compile(optimizer=keras.optimizers.Adam(),\n",
    "             loss=keras.losses.SparseCategoricalCrossentropy(),\n",
    "            metrics=['accuracy'])\n",
    "deep_model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 54000 samples, validate on 6000 samples\n",
      "Epoch 1/5\n",
      "54000/54000 [==============================] - 120s 2ms/sample - loss: 0.2683 - accuracy: 0.9163 - val_loss: 0.0470 - val_accuracy: 0.9880\n",
      "Epoch 2/5\n",
      "54000/54000 [==============================] - 114s 2ms/sample - loss: 0.0979 - accuracy: 0.9697 - val_loss: 0.0444 - val_accuracy: 0.9853\n",
      "Epoch 3/5\n",
      "54000/54000 [==============================] - 118s 2ms/sample - loss: 0.0718 - accuracy: 0.9780 - val_loss: 0.0358 - val_accuracy: 0.9903\n",
      "Epoch 4/5\n",
      "54000/54000 [==============================] - 115s 2ms/sample - loss: 0.0559 - accuracy: 0.9825 - val_loss: 0.0463 - val_accuracy: 0.9887\n",
      "Epoch 5/5\n",
      "54000/54000 [==============================] - 115s 2ms/sample - loss: 0.0504 - accuracy: 0.9839 - val_loss: 0.0315 - val_accuracy: 0.9922\n"
     ]
    }
   ],
   "source": [
    "history = deep_model.fit(x_train, y_train, batch_size=64, epochs=5, validation_split=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD8CAYAAACb4nSYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl8VPW9//HXJ3tIAoRkApgASdhxQ42IGwRXUOte0Vavtrdyu3hL9VoL9lF79VevtNrFVnu9arG1rbVcrJbeC+LGotelgIIFISEsmoQlk0ASEsj++f1xTsJkCGZCJpmZzOf5eOSRM+d8Z+aTA/M+3/meM98RVcUYY0x0iAl1AcYYY/qPhb4xxkQRC31jjIkiFvrGGBNFLPSNMSaKWOgbY0wUsdA3xpgoYqFvjDFRxELfGGOiSFyoC/CXmZmpubm5oS7DGGMiyoYNGypV1dNdu7AL/dzcXNavXx/qMowxJqKIyKeBtLPhHWOMiSIW+sYYE0Us9I0xJoqE3Zh+V5qbmykrK6OhoSHUpQwISUlJ5OTkEB8fH+pSjDH9LCJCv6ysjLS0NHJzcxGRUJcT0VSVqqoqysrKyMvLC3U5xph+FhHDOw0NDWRkZFjgB4GIkJGRYe+ajIlSERH6gAV+ENm+NCZ6RcTwjjHGDDiqUO+F6lKo+QxqyiAhFQq+0qdPa6EfoOrqal544QW++c1v9uh+V1xxBS+88AJDhw49bpsHHniAGTNmcMkll/S2TGNMuGhpgtpyqCl1At033Kvdda2Nne+Tc3afh76E2xejFxQUqP8ncrdu3crkyZNDVJFj9+7dXHXVVWzevLnT+paWFuLiIu/YGQ771JiI1lDrBHdNKVR/5rNc6vw+tA/wy9fU4TBkFAwdBUNyYMhod9m9nXz8zmF3RGSDqhZ01y6gtBKR2cDjQCzwrKou8ts+BlgMeIADwK2qWuZu+zFwpdv0/6nqnwP+K8LIggUL2LFjB1OnTiU+Pp6kpCTS09PZtm0bxcXFXHvttZSWltLQ0MD8+fOZN28ecHRaibq6OubMmcMFF1zAu+++S3Z2Nn/9619JTk7mjjvu4KqrruLGG28kNzeX22+/nb/97W80Nzfz3//930yaNAmv18uXvvQl9uzZw7nnnsvrr7/Ohg0byMzMDPGeMWYAamtzhl66DPQyp8feUNP5PjHxbpDnwNiLjga5b6jHJYbm7/HRbeiLSCzwJHApUAasE5FlqvqJT7PHgOdV9XcichHwCHCbiFwJnAlMBRKB1SKyQlVrT7TgB/+2hU/2nPDduzTlpMH88Asnf26bRYsWsXnzZjZu3Mjq1au58sor2bx5c8dlj4sXL2bYsGEcOXKEs88+mxtuuIGMjIxOj7F9+3b+9Kc/8cwzz3DTTTfx0ksvceuttx7zXJmZmXz44Yf8+te/5rHHHuPZZ5/lwQcf5KKLLmLhwoW8+uqr/OY3vwneDjAm2rQ0QW2Zz1BLaedeek35sUMviYOP9tJHn+PTYx/tBHrqcIgJ/2tjAunpTwNKVHUngIi8CFwD+Ib+FOAed3kV8IrP+rWq2gK0iMjHwGxgSRBqD6lp06Z1us79l7/8JS+//DIApaWlbN++/ZjQz8vLY+rUqQCcddZZ7N69u8vHvv766zva/OUvfwHgnXfe6Xj82bNnk56eHtS/x3ShtRmqdkDFJ1CxFbxbobUFkgZDYpoTAh3LQ5zfSYOd9e3LCWkQG3nDfxGvodYvxH2Xy44z9DLCCfGRp8Okq2CoG+bt4Z40JCR/SrAF8r8xGyj1uV0GnOPXZhNwPc4Q0HVAmohkuOt/KCI/BQYBs+h8sOix7nrk/SUlJaVjefXq1bzxxhu89957DBo0iMLCwi6vg09MPPrWLjY2liNHjnT52O3tYmNjaWlpCXLl5hhtbVC92wn29oCv2AqV26Gt2WkjMTAsH+KSoaIWGmudYNHW7h8/PuU4B4rBPrd9DhTtBxHfdvHJYJfaOtraoL6ii0D3GYJp9Bt6iU2AwdlOeI+9+NhhlzAZeukPweqC3As8ISJ3AGuBcqBVVV8TkbOBdwEv8B5wzKtEROYB8wBGjx4dpJKCKy0tjUOHDnW5raamhvT0dAYNGsS2bdt4//33g/78559/PkuWLOF73/ser732GgcPHgz6cwx4qlC7xy/cPwFvEbT4HICHjoasKTDhcud31mTIGA/xScc+XvMR5wDQeMg5CDTW+CzX+i27B4r2E4Dt25rru689Ji6AA4Xv+sHHvvNIHBwZ7zpaGp2rXnx75u1XvlSXOttamzrfJ3HI0ZOjo8899kRpSlZEDL30h0D+B5QDo3xu57jrOqjqHpyePiKSCtygqtXutoeBh91tLwDF/k+gqk8DT4Nz9U6P/4p+kJGRwfnnn88pp5xCcnIyw4cP79g2e/ZsnnrqKSZPnszEiROZPn160J//hz/8Ibfccgu///3vOffccxkxYgRpaWlBf54Bo76yc7BXbHOWfXuAqSOcQC/4qvM7awp4JkJiamDPIQIJg5yftBEnXmtrCzR1daA45NTbsex3EKktO7rck3cdXR4oPmeIqtP6NIgf1Lt3HQ01foH+Wedwr9vPcYdeTjoDJn/BHXrxOVE6QIZe+kO3l2yKSBxOUF+ME/brgC+p6hafNpnAAVVtE5GHcXr5D7gngYeqapWInAa8AEx1x/i7FK6XbIZaY2MjsbGxxMXF8d577/GNb3yDjRs3nvDjDZh92lDjBrrPuHvFVufKi3ZJQ2H4yW6wTwaP+3vQsNDVHWwd7zoOHT0INHb1buOQs8+OObjUBv6uQ2IDOFC4B5Sm+mMvZWz0uxAjNuHoEEvHJYw+Y+mDs6Nm6KU3gnbJpqq2iMhdwEqcSzYXq+oWEXkIWK+qy4BC4BERUZzhnW+5d48H3nY/9l+LcymnDVKfgM8++4ybbrqJtrY2EhISeOaZZ0JdUv9qOgyVRcf23GvLjraJT3HCfMJsd1hmkvM7dfjAHw/v9K5jePftj6fTuw7/dxc1XR8oGg85Qy4NW4+ub/N5mbcPvQwdDWPOOzqW3n6i1IZe+lVAA3yquhxY7rfuAZ/lpcDSLu7XgHMFT99ra4PqT50xy5h4Zww01v0dE++sl8j9jzV+/Hg++uijUJfR91qaoKrEHWvfdjTkD+yi4y1/bCJ4JjgB0j4skzXZCRILj96JjYPkdOfnRKlCS4NzQIhPsqGXMBMBZ3UCpK3u29uW449tSmzng0HHQWFgHSAiQlsrHNzt02t3h2eqth/tJUosZIyDEafCaXOPBnx6XmSckIxWIs7VRvHJoa7EdGHgvHJi42G4+6airc0JjrZm53dr89Hbre7v9vHPzztAfN67ho71doD4XKrOmK53WxdXzPhc1jp0jBPoE+cc7blnjrexXGOCbOCEvq+YGIhJABK6b9vW5nNw8D9QuMvtl+VpW9ePIbFdHBTaDxQ+B4eYAX6AqPP6XTGz1Ql73xN3aSOdQD/7a0dPrGb24IoZY0yvDMzQ74mYGIhJxJklohttre47huO8e2htca5+aGzp4QHC/92D+ztcTz4eqfbrubshf7jqaJvkdMg6ufOwTNak3o0VG2N6zUK/J2JinZ8ADhCpqanUVVexp6yUb9/9byz9w7Od300EcIDY+EkJeyqquOKyiyE2nmWvruKT4h0s+O7dxx4o+uIA0VTvDMP4f1L10J6jbRJSnVCfdKV7nXv7FTNZ4XvQMiaKWej3pbhETsodx9KX//r57drfQfi9e9hY/BbrP9zEFZfOgqZ6rp55JlfPnOp8mMVf+wnp7t49dHWAaGlyTqD6h/vB3XS+YmYi5M04OizTfsWMhbsxEcNCP0ALFixg1KhRfOtbzkcQ/v3f/524uDhWrVrFwYMHaW5u5kc/+hHXXHNNp/v5zsM/ffp0fvOb33Dyyc78QYWFhTz22GO0tbUxf/58GhoaSE5O5rnnniMvL48HFj3OkSNHeGf9xyxcuJAjhw+zfv16nnj8p+zesYOv/ss3qKysxJORwXNP/ITRJw3njm/9G4NTB7F+42b2eav4yffnc+NVfl/OEhMHhyrhd99zPv1YVdL5ipnM8XDSVDj9lqNDM8Py3Hc5xphIFnmhv2IB7PtHcB9zxKkwZ9HnNpk7dy7f+c53OkJ/yZIlrFy5km9/+9sMHjyYyspKpk+fztVXX33c76CdO3cuS5Ys4cEHH2Tv3r3s3buXgoICamtrefvtt4mLi+ONN97g/vvv56WXXuKhhx5yQv6JJwD47W9/6/Sq45L413sXcPtX/pnbb7+dxYsX8+0f/JhXXnkFkoawt6aedz74kG1bP+Hqa6/lxtu/0fncQ1sLxBx0hm+G5R8dmsma7FwiaVfMGDNgRV7oh8gZZ5xBRUUFe/bswev1kp6ezogRI7j77rtZu3YtMTExlJeXs3//fkaM6HoelptuuonLLruMBx98kCVLlnDjjTcCzoRtt99+O9u3b0dEaG5u7rae9957r2Pa5dtuu4377ruvY9u1115LTGwsU045lf37K7q+MialHu588wT2hDEmkkVe6HfTI+9LX/ziF1m6dCn79u1j7ty5/PGPf8Tr9bJhwwbi4+PJzc3tckrldtnZ2WRkZPDxxx/z5z//maeeegqAH/zgB8yaNYuXX36Z3bt3U1hY2Ks6fadwDrevwzTGhFbkhX4IzZ07lzvvvJPKykrWrFnDkiVLyMrKIj4+nlWrVvHpp58G9Bg/+clPqKmp4bTTTgOcnn52djbgDuG4Pm865/POO48XX3yR2267jT/+8Y9ceOGFvf8DjTE90tamHG5u5XBjC3WNLRxuaqW+/XdTC4cbW931LdQ3Oe3q3Ta+tw83tVDf2MqkEWn84Wv+X1cSXBb6PXDyySdz6NAhsrOzGTlyJF/+8pf5whe+wKmnnkpBQQGTJk3q9jFuvPFG5s+fzw9+8IOOdffddx+33347P/rRj7jyyis71s+aNYtFixYxdepUFi5c2OlxfvWrX/GVr3yFRx99FI/Hw3PPPRe8P9SYAag9oOsbW44Gs09AO+tbOwV0nd/towHttD3SHMB01q64GCElMY6UhFhSEuMY5C4PHZRASmIsgxLiGOtJ6f6BeqnbqZX7m02t3D9sn5pw1tamTk/ZN5jd3x09Z59A7iqw6zvu0/OAjo9tD+g4BiXEdgT0oIQ4UhM7324P7NREp22Kz+8Un3YJcX37afygTa1sjDE9oapUHGpkh7eOqrqmTgHd0XM+pkftBPqJBHRCbAyDEmM7BXRqYizpKQlO4HYK7LhObdsDOtWn590fAR1KFvrGmBPS0NzKrsp6dnrr2emtY4e3jp3u7brGrr82wzeg23vIKYmxpKcM6gjojh5zQueA7hTMURLQfSFiQl9Vj3v9u+mZcBvSM+FLVdlf2+iEemU9Oyrag72O8uoj+P5Xyh6aTL4nhRvOzGZsVir5malkDU4kJTGO1IQ4khNiLaDDQESEflJSElVVVWRkZFjw95KqUlVVRVJSUveNTdQ40uT22ivr2FHh/G7vwdc3HR1qGZQQS74nhTNHp/PFs0aR70kh35NCXmYKgxIiIk6iXkD/SiIyG3gc5+sSn1XVRX7bxwCLAQ9wAOdrEcvcbT8BrgRigNeB+drDrmZOTg5lZWV4vd7uG5tuJSUlkZOTE+oyTD9TVfbVNvgMx9Q7QzLeesqrj3S0E4GThji99i8WjGKsJ4V8Tyr5nhRGDE6yjleE6zb03S83fxK4FCgD1onIMlX9xKfZY8Dzqvo7EbkIeAS4TUTOA84HTnPbvQPMBFb3pMj4+Hjy8vJ6chdjotaRplafnrob7JV17PLWd+q1pyTEku9JpSA3nbket9eemUpeZgrJCTbP0kAVSE9/GlCiqjsBRORF4BrAN/SnAPe4y6uAV9xlBZJwvs1EcL4ofX/vyzYmuqkqe2vcXntlnc9Y+7G9dmesPZWzc4eR70llbKbTcx8+ONF67VEokNDPBkp9bpcB/h8Z2wRcjzMEdB2QJiIZqvqeiKwC9uKE/hOqurX3ZRsTHQ43tbjB3vkk6q7Keg779NpTE+PI96Rwdm46N3tGdQzH5GWmkBRvvXZzVLDOvNwLPCEidwBrgXKgVUTGAZOB9gHk10XkQlV92/fOIjIPmAcwevToIJVkTGRoa1P21jaw0x1fbx9n3+mtY0/N0bmcRCAnPZn8zFTOycvoOIk6zpOKJ8167SYwgYR+OTDK53aOu66Dqu7B6ekjIqnADapaLSJ3Au+rap27bQVwLvC23/2fBp4G5xO5J/anGBPe6htb2FXphPoON9R3euvZVVnf6cNIaW6vfXp+e7A7vfbcDOu1m94LJPTXAeNFJA8n7G8GvuTbQEQygQOq2gYsxLmSB+Az4E4ReQRneGcm8Isg1W5M2GlrU/bUHOl0hUz7SdW9Pr32GIGc9EHke1I4d2xGx0nUsVkpeFKt1276Trehr6otInIXsBLnks3FqrpFRB4C1qvqMqAQeEREFGd451vu3ZcCFwH/wDmp+6qq/i34f4Yx/au+saXTSdQd7knUXZV1NDQf/c7jtKQ48j2pnDs2g7GeVPIzUxiblcroYYOs125CIiImXDMmlBqaW/lg1wHWFnvZureWnd569tV27rWPGjaoI9Tbh2PGelLJTE2wXrvpFzbhmjG9sKuynjVFFawu9vL+zioamttIjIth8sjBnD8u0w11J9hHZwwiMc567SYyWOgbg/OBpvd2VrKmyMvqYi+fVh0GIC8zhZvPHk3hRA/T8zNsSMZEPAt9E5VUlR3eelYXVbCm2MsHuw7Q1NJGcnws543N4J8vyGPmBA9jMvr+Sy2M6U8W+iZq1De28O6Oqo6gLzvofHJ1XFYq/zR9DDMnejg7d5j15s2AZqFvBixVpXh/XUfIr9t9gOZWJSUhlvPGZfKNwrHMnOAhJ31QqEs1pt9Y6JsBpbahmXdLKlld5GVNsbfj2vhJI9L4qjtkUzBmmM3rbqKWhb6JaKrKJ3trWVPsZXWRlw8/PUhLm5KWGMcF4zP5ziUeZkzwMHJIcqhLNSYsWOibiFNzuJm3S7wdvXnvoUYATj5pMPNm5FM4MYszRg8lPtZ688b4s9A3Ya+tTdm8p6bjcsqPPjtIm8KQ5HguHJ9J4cQsZozPJGuwfRuYMd2x0Ddh6UB9E29v97KmyMva7V4q65oQgdOyh3DXrHHMnJjF1FFDiY2xT7sa0xMW+iYstLYpm8qqO3rzH5dVowrDUhKYMT6TmRM9zBjvISM1MdSlGhPRLPRNyHgPNbK22BmXf3u7l4OHm4kROH3UUL5z8QQKJ3o4JXuI9eaNCSILfdNvWlrb2FhazeoiL6uLK9hcXgtAZmoiF00azsyJHi4cl0l6SkKIKzVm4LLQN31qf20Da4qdsfm3t3upbWghNkY4c/RQvnv5RGZO8DBl5GBirDdvTL+w0DdB1dzaxoZPD3ZcTrl1r9ObHz44kdmnjKBwYhbnj8tkSHJ8iCs1JjpZ6Jte21N9xP1wVAX/V1JFXWMLcTFCQW46C+ZMYuYED5NGpNm88saEAQt902ONLa2s332wY06b4v11AJw0JIkvnH4ShRM9nDc2g7Qk680bE24CCn0RmQ08jvN1ic+q6iK/7WNwvhfXAxwAblXVMhGZBfzcp+kk4GZVfSUYxZv+U3rgMKuLvawpquDdHVUcbmolITaGaXnDuKlgFDMneBiXlWq9eWPCXLehLyKxwJPApUAZsE5ElqnqJz7NHgOeV9XfichFwCPAbaq6CpjqPs4woAR4Lch/g+kD7V8RuMa90mantx6AUcOSueHMnI4vFUlJtDeLxkSSQF6x04ASVd0JICIvAtcAvqE/BbjHXV4FdNWTvxFYoaqHT7xc05d2VzpfKuL/FYHT8zO49ZwxFE70kJeZYr15YyJYIKGfDZT63C4DzvFrswm4HmcI6DogTUQyVLXKp83NwM96UasJsiNNrby/s6oj6O0rAo0Z+IL13vxe4AkRuQNYC5QDre0bRWQkcCqwsqs7i8g8YB7A6NGjg1SS+Tw1R5qZ/Yu17K1psK8INCaKBBL65cAon9s57roOqroHp6ePiKQCN6hqtU+Tm4CXVbW5qydQ1aeBpwEKCgo04OrNCfv16hL21Tbwn18+k1mTsqw3b0yUCGTC8XXAeBHJE5EEnGGaZb4NRCRTRNofayHOlTy+bgH+1NtiTXCUVx/huf/bzXVnZDPn1JEW+MZEkW5DX1VbgLtwhma2AktUdYuIPCQiV7vNCoEiESkGhgMPt99fRHJx3imsCWrl5oT99LUiAP7tsokhrsQY098CGtNX1eXAcr91D/gsLwWWHue+u3FOBpswsGVPDS9/VM68GflkD7WvEDQm2tj3yUWZRSu2MSQ5nm8Wjgt1KcaYELDQjyJvb/fy9vZK7po1ziY8MyZKWehHibY25ZHl28hJT+a2c8eEuhxjTIhY6EeJv24q55O9tXz38okkxtnVOsZEKwv9KNDQ3MpjK4s5NXsIXzjtpFCXY4wJIQv9KPD8e7sprz7Cwism2TdUGRPlLPQHuOrDTTzxVgmzJno4b2xmqMsxxoSYhf4A9+SqEuoaW1gwZ3KoSzHGhAEL/QGs9MBhfvfup9x4Vg4TR6SFuhxjTBiw0B/AfvpaESJw96UTQl2KMSZMWOgPUJvLa3hl4x7++YI8Rg6x6RaMMQ4L/QFIVfmP5VtJHxTP1wvHhrocY0wYsdAfgNYUe3l3RxXfvng8g5NsugVjzFEW+gNMa5uyaMU2Rg8bxJfPsekWjDGdWegPMH/5sIxt+w5x3+yJJMTZP68xpjNLhQGkobmVn71ezOk5Q7jy1JGhLscYE4Ys9AeQ5/5vN3trGlh4xWREbLoFY8yxAgp9EZktIkUiUiIiC7rYPkZE3hSRj0VktYjk+GwbLSKvichWEfnE/fpEE2QH6pv49aoSLpmcxfT8jFCXY4wJU92GvojEAk8Cc4ApwC0iMsWv2WPA86p6GvAQ8IjPtueBR1V1MjANqAhG4aazJ94qob6phe/NnhTqUowxYSyQnv40oERVd6pqE/AicI1fmynAW+7yqvbt7sEhTlVfB1DVOlU9HJTKTYfPqg7z+/d3M/fsUYwfbtMtGGOOL5DQzwZKfW6XcewXnW8CrneXrwPSRCQDmABUi8hfROQjEXnUfedggujR14qIi4nhO5fYdAvGmM8XrBO59wIzReQjYCZQDrQCccCF7vazgXzgDv87i8g8EVkvIuu9Xm+QSooOm0qr+dumPdx5YR7DByeFuhxjTJgLJPTLgVE+t3PcdR1UdY+qXq+qZwDfd9dV47wr2OgODbUArwBn+j+Bqj6tqgWqWuDxeE7wT4k+7dMtZKQkMG+mTbdgjOleIKG/DhgvInkikgDcDCzzbSAimSLS/lgLgcU+9x0qIu1JfhHwSe/LNgCriir4YNcB5l8yntTEuFCXY4yJAN2GvttDvwtYCWwFlqjqFhF5SESudpsVAkUiUgwMBx5279uKM7Tzpoj8AxDgmaD/FVGopbWNR5ZvIy8zhVumjQ51OcaYCBFQ91BVlwPL/dY94LO8FFh6nPu+DpzWixpNF176sIztFXX855fPJD7WPmNnjAmMpUUEOtzUws9eL+aM0UOZfcqIUJdjjIkgFvoRaPE7u9hf28j9Nt2CMaaHLPQjTFVdI0+t2cllU4Zzdu6wUJdjjIkwFvoR5ldvlXCkuZX7bLoFY8wJsNCPILsr6/nD+59y89mjGJeVGupyjDERyEI/gjy6soiEuBjmXzI+1KUYYyKUhX6E+Oizg/zvP/Yyb0Y+WWk23YIx5sRY6EcAVeWR5dvITE3kzgvzQ12OMSaCWehHgDe2VvD33Qe4+9LxpNh0C8aYXrDQD3MtrW0sWrGVfE8KcwtGdX8HY4z5HBb6YW7J+jJ2eOv53uxJxNl0C8aYXrIUCWP1jS38/I1iCsakc9mU4aEuxxgzAFjoh7Fn396F91AjC226BWNMkFjohynvoUb+a+0O5pwygrPGpIe6HGPMAGGhH6Yef7OYppY2vnv5xFCXYowZQCz0w9AObx1/+nspXzpnNPkem27BGBM8Fvph6NFXi0iKi+HbF9t0C8aY4Aoo9EVktogUiUiJiCzoYvsYEXlTRD4WkdUikuOzrVVENro/y/zvazrb8OkBXt2yj6/PHEtmamKoyzHGDDDdfrxTRGKBJ4FLgTJgnYgsU1XfLzh/DHheVX8nIhcBjwC3uduOqOrUINc9IKkq/7F8G1lpifzzhXmhLscYMwAF0tOfBpSo6k5VbQJeBK7xazMFeMtdXtXFdhOAlVv2s+HTg9xz6QQGJdh0C8aY4Ask9LOBUp/bZe46X5uA693l64A0EclwbyeJyHoReV9Eru1VtQNYc2sbP3l1G+OzUrnxrJzu72CMMScgWCdy7wVmishHwEygHGh1t41R1QLgS8AvRGSs/51FZJ57YFjv9XqDVFJkeXFdKTsr61kwx6ZbMMb0nUDSpRzwnekrx13XQVX3qOr1qnoG8H13XbX7u9z9vRNYDZzh/wSq+rSqFqhqgcfjOZG/I6LVNbbw+BvFTMsbxkWTskJdjjFmAAsk9NcB40UkT0QSgJuBTlfhiEimiLQ/1kJgsbs+XUQS29sA5wO+J4AN8PTanVTWNXG/TbdgjOlj3Ya+qrYAdwErga3AElXdIiIPicjVbrNCoEhEioHhwMPu+snAehHZhHOCd5HfVT9Rr6K2gWfW7uTK00YyddTQUJdjjBngArpERFWXA8v91j3gs7wUWNrF/d4FTu1ljQPaz9/YTktbG/fZdAvGmH5gZwxDqKTiEH9e9xlfPmcMYzJSQl2OMSYKWOiH0KIVRaQkxPGvF40LdSnGmChhoR8if991gDe27ufrhWPJsOkWjDH9xEI/BJzpFrYyYnASXz3fplswxvQfC/0QWLF5HxtLq7nnsgkkJ8SGuhxjTBSx0O9nTS3OdAsTh6dxw5k23YIxpn9Z6PezP/39M3ZXHWbBFZOIjbEPYhlj+peFfj861NDM429u57yxGRROiL7pJowxoWeh34/+a81ODtQ3sXCOTbdgjAkNC/1+sq+mgWff2cnVp5/EqTlDQl2OMSZKWej3k5+/Xkxrm/Jdm2521cs5AAAO0UlEQVTBGBNCFvr9oGjfIf57Qyn/dG4uo4YNCnU5xpgoZqHfD3786jZSEuO4a5ZNt2CMCS0L/T727o5K3tpWwbdmjSM9JSHU5RhjopyFfh9qa1MWrdjGSUOSuOO83FCXY4wxFvp96X/+sZePy2r4t8smkhRv0y0YY0LPQr+PNLa08ujKbUweOZhrz8gOdTnGGANY6PeZP77/GaUHjrBwjk23YIwJHwGFvojMFpEiESkRkQVdbB8jIm+KyMcislpEcvy2DxaRMhF5IliFh7OaI8386q3tXDg+kxk23YIxJox0G/oiEgs8CcwBpgC3iMgUv2aPAc+r6mnAQ8Ajftv/H7C29+VGhqfW7KD6SDPfmz0p1KUYY0wngfT0pwElqrpTVZuAF4Fr/NpMAd5yl1f5bheRs4DhwGu9Lzf87ak+wuJ3dnHd1GxOybbpFowx4SWQ0M8GSn1ul7nrfG0CrneXrwPSRCRDRGKAnwL3ft4TiMg8EVkvIuu9Xm9glYepn71ejAL3XDYh1KUYY8wxgnUi915gpoh8BMwEyoFW4JvAclUt+7w7q+rTqlqgqgUeT+SOgW/dW8tLH5Zxx3m55KTbdAvGmPATF0CbcmCUz+0cd10HVd2D29MXkVTgBlWtFpFzgQtF5JtAKpAgInWqeszJ4IFg0YptDE6K51uFNt2CMSY8BRL664DxIpKHE/Y3A1/ybSAimcABVW0DFgKLAVT1yz5t7gAKBmrgv7O9kjXFXr5/xWSGDIoPdTnGGNOlbod3VLUFuAtYCWwFlqjqFhF5SESudpsVAkUiUoxz0vbhPqo3LLW1KY+s2Er20GRuO3dMqMsxxpjjCqSnj6ouB5b7rXvAZ3kpsLSbx/gt8NseVxgBlm3aw5Y9tfxi7lSbbsEYE9bsE7m91NDcyqMrizj5pMFcffpJoS7HGGM+l4V+L/3+vU8prz7C/VdMJsamWzDGhDkL/V6oOdzME6tKmDnBw/njMkNdjjHGdMtCvxd+vbqE2oZmFsyx6RaMMZHBQv8ElR08zHPv7uaGM3OYPHJwqMsxxpiAWOifoJ+9VowA91xq0y0YYyKHhf4J2Fxew8sby/nqBXmcNDQ51OUYY0zALPRPwI9f3cbQ5Hi+UTg21KUYY0yPWOj30NpiL29vr+Sui8YzOMmmWzDGRBYL/R5obVMeWbGNUcOSuXX66FCXY4wxPWah3wOvfFTO1r21fPfySSTG2XQLxpjIY6EfoIbmVn76WhGn5QzhqlNHhrocY4w5IRb6Afrtu7vZU9PAgjmTbLoFY0zEstAPwMH6Jp5cVcJFk7I4b6xNt2CMiVwW+gF4YlUJ9Y0tfG+2TbdgjIlsFvrdKD1wmOff280XzxrFxBFpoS7HGGN6xUK/G4+9VkRsjHC3TbdgjBkAAgp9EZktIkUiUiIix3zHrYiMEZE3ReRjEVktIjk+6z8UkY0iskVEvh7sP6Av/aOshr9u3MPXLshnxJCkUJdjjDG91m3oi0gs8CQwB5gC3CIiU/yaPQY8r6qnAQ8Bj7jr9wLnqupU4BxggYhExNdLqSr/sXwrw1IS+JeZ+aEuxxhjgiKQnv40oERVd6pqE/AicI1fmynAW+7yqvbtqtqkqo3u+sQAny8srC728t7OKuZfPJ40m27BGDNABBLC2UCpz+0yd52vTcD17vJ1QJqIZACIyCgR+dh9jB+r6h7/JxCReSKyXkTWe73env4NQdfapixavo3cjEHcMs2mWzDGDBzB6nnfC8wUkY+AmUA50AqgqqXusM844HYRGe5/Z1V9WlULVLXA4/EEqaQT99KHZRTtP8R3L59EQlzEvDkxxphuBZJo5cAon9s57roOqrpHVa9X1TOA77vrqv3bAJuBC3tVcR870tTKz14r5vRRQ7ni1BGhLscYY4IqkNBfB4wXkTwRSQBuBpb5NhCRTBFpf6yFwGJ3fY6IJLvL6cAFQFGwiu8Li/9vF/tqG7h/ziREbLoFY8zA0m3oq2oLcBewEtgKLFHVLSLykIhc7TYrBIpEpBgYDjzsrp8MfCAim4A1wGOq+o8g/w1BU1XXyH+u3sElk4dzTn5GqMsxxpigiwukkaouB5b7rXvAZ3kpsLSL+70OnNbLGvvNr94q4XBTCwvmTAx1KcYY0yfsLKVrd2U9f3j/U+aePZpxWTbdgjFmYLLQdz36WhHxsTHcfcn4UJdijDF9xkIf2Fhazf9+vJc7Z+STNdimWzDGDFxRH/qqyiPLt5KZmsC8GTbdgjFmYIv60H9rWwUf7DrA/EsmkJoY0HltY4yJWFEd+i2tbSxasY38zBRuPntU93cwxpgIF9Whv3RDGdsr6rhv9iTiY6N6VxhjokTUJt3hphZ+9noxZ41J5/KTj5kOyBhjBqSoDf3fvL2LikON3H+FTbdgjIkeURn6lXWNPLVmB5efPJyzxgwLdTnGGNNvojL0f/nmdhpa2rhv9qRQl2KMMf0q6kJ/p7eOFz74jFumjWKsJzXU5RhjTL+KutB/dGURCXExzL94QqhLMcaYfhdVob/h04Os2LyPf5kxFk9aYqjLMcaYfhc1od8+3YInLZGvXZgX6nKMMSYkoib0X/tkP+s/Pcjdl0wgxaZbMMZEqagI/ZbWNn786jbGelK4qSAn1OUYY0zIBBT6IjJbRIpEpEREFnSxfYyIvCkiH4vIahHJcddPFZH3RGSLu21usP+AQPx5fSk7vfUsmDOZOJtuwRgTxbpNQBGJBZ4E5gBTgFtEZIpfs8eA51X1NOAh4BF3/WHgn1T1ZGA28AsRGRqs4gNR39jCz1/fzrTcYVwyOas/n9oYY8JOIN3eaUCJqu5U1SbgReAavzZTgLfc5VXt21W1WFW3u8t7gArAE4zCA/XM2zuprGtkoU23YIwxAYV+NlDqc7vMXedrE3C9u3wdkCYiGb4NRGQakADs8H8CEZknIutFZL3X6w209m5VHGrg6bU7ufLUkZwxOj1oj2uMMZEqWAPc9wIzReQjYCZQDrS2bxSRkcDvga+oapv/nVX1aVUtUNUCjyd4bwQef2M7TS1tfPfyiUF7TGOMiWSBXLtYDvh+w0iOu66DO3RzPYCIpAI3qGq1e3sw8L/A91X1/WAUHYiSijpeXFfKreeMJjczpb+e1hhjwlogPf11wHgRyRORBOBmYJlvAxHJFJH2x1oILHbXJwAv45zkXRq8srv3k1e3kRwfy79ePL4/n9YYY8Jat6Gvqi3AXcBKYCuwRFW3iMhDInK126wQKBKRYmA48LC7/iZgBnCHiGx0f6YG+4/wt273AV77ZD9fn5lPZqpNt2CMMe1EVUNdQycFBQW6fv36E76/qnL9f77LnuojrL53FskJsUGszhhjwpOIbFDVgu7aDbhPKr26eR8ffVbNPZdOsMA3xhg/Ayr0m93pFiYMT+WGM226BWOM8TegQv9Pf/+M3VWHWTBnkk23YIwxXRgwyXiooZnH39jO9PxhzJpo0y0YY0xXBswcw0eaWinITeebheNsugVjjDmOARP6WYOT+K/buj1xbYwxUW3ADO8YY4zpnoW+McZEEQt9Y4yJIhb6xhgTRSz0jTEmiljoG2NMFLHQN8aYKGKhb4wxUSTsplYWES/waS8eIhOoDFI5wWR19YzV1TNWV88MxLrGqGq33zcbdqHfWyKyPpA5pfub1dUzVlfPWF09E8112fCOMcZEEQt9Y4yJIgMx9J8OdQHHYXX1jNXVM1ZXz0RtXQNuTN8YY8zxDcSevjHGmOOIyNAXkdkiUiQiJSKyoIvtiSLyZ3f7ByKSGyZ13SEiXhHZ6P58rZ/qWiwiFSKy+TjbRUR+6db9sYicGSZ1FYpIjc/+eqCf6holIqtE5BMR2SIi87to0+/7LMC6+n2fiUiSiPxdRDa5dT3YRZt+f00GWFdIXpPuc8eKyEci8j9dbOu7/aWqEfUDxAI7gHwgAdgETPFr803gKXf5ZuDPYVLXHcATIdhnM4Azgc3H2X4FsAIQYDrwQZjUVQj8Twj210jgTHc5DSju4t+y3/dZgHX1+z5z90GquxwPfABM92sTitdkIHWF5DXpPvc9wAtd/Xv15f6KxJ7+NKBEVXeqahPwInCNX5trgN+5y0uBi6Xvv0MxkLpCQlXXAgc+p8k1wPPqeB8YKiIjw6CukFDVvar6obt8CNgKZPs16/d9FmBd/c7dB3XuzXj3x/9kYb+/JgOsKyREJAe4Enj2OE36bH9FYuhnA6U+t8s49j9+RxtVbQFqgIwwqAvgBnc4YKmIjOrjmgIVaO2hcK779nyFiJzc30/uvq0+A6eX6Cuk++xz6oIQ7DN3qGIjUAG8rqrH3V/9+JoMpC4IzWvyF8B9QNtxtvfZ/orE0I9kfwNyVfU04HWOHslN1z7E+Wj56cCvgFf688lFJBV4CfiOqtb253N/nm7qCsk+U9VWVZ0K5ADTROSU/nje7gRQV7+/JkXkKqBCVTf09XN1JRJDvxzwPRrnuOu6bCMiccAQoCrUdalqlao2ujefBc7q45oCFcg+7XeqWtv+9lxVlwPxIpLZH88tIvE4wfpHVf1LF01Css+6qyuU+8x9zmpgFTDbb1MoXpPd1hWi1+T5wNUishtnGPgiEfmDX5s+21+RGPrrgPEikiciCTgnOZb5tVkG3O4u3wi8pe4ZkVDW5TfmezXOmGw4WAb8k3tFynSgRlX3hrooERnRPo4pItNw/r/2eVC4z/kbYKuq/uw4zfp9nwVSVyj2mYh4RGSou5wMXAps82vW76/JQOoKxWtSVReqao6q5uLkxFuqeqtfsz7bX3HBeJD+pKotInIXsBLnipnFqrpFRB4C1qvqMpwXxu9FpATnROHNYVLXt0XkaqDFreuOvq4LQET+hHNVR6aIlAE/xDmphao+BSzHuRqlBDgMfCVM6roR+IaItABHgJv74eANTk/sNuAf7ngwwP3AaJ/aQrHPAqkrFPtsJPA7EYnFOcgsUdX/CfVrMsC6QvKa7Ep/7S/7RK4xxkSRSBzeMcYYc4Is9I0xJopY6BtjTBSx0DfGmChioW+MMVHEQt8YY6KIhb4xxkQRC31jjIki/x/87N5bPb/jbwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'valivation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 4s 365us/sample - loss: 0.0288 - accuracy: 0.9909\n"
     ]
    }
   ],
   "source": [
    "result = deep_model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.NIN网络\n",
    "Min等人在 2013年（https://arxiv.org/abs/1312.4400）提出了减少模型中参数数量的方法之一\n",
    "即“网络中的网络（NIN）”或“1X1卷积”\n",
    "方法很简单 - 在其他卷积层之后添加卷积层\n",
    "具有降低图像空间的维度（深度）的效果，有效地减少了参数的数量\n",
    "![](https://raw.githubusercontent.com/iamaaditya/iamaaditya.github.io/master/images/conv_arithmetic/full_padding_no_strides_transposed_small.gif)\n",
    "GoogleNet 中就用到了NIN结构"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_shape  = x_train.shape\n",
    "deep_model = keras.Sequential(\n",
    "[\n",
    "    layers.Conv2D(input_shape=((x_shape[1], x_shape[2], x_shape[3])),\n",
    "                 filters=32, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.Conv2D(filters=16, kernel_size=(1,1), strides=(1,1), padding='valid', activation='relu'),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.MaxPool2D(pool_size=(2,2)),\n",
    "    layers.Conv2D(filters=32, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.Conv2D(filters=16, kernel_size=(1,1), strides=(1,1), padding='valid', activation='relu'),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.MaxPool2D(pool_size=(2,2)),\n",
    "    layers.Flatten(),\n",
    "    layers.Dense(32, activation='relu'),\n",
    "    layers.Dropout(0.2),\n",
    "    layers.Dense(10, activation='softmax')\n",
    "    \n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_2\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d_8 (Conv2D)            (None, 28, 28, 32)        320       \n",
      "_________________________________________________________________\n",
      "batch_normalization_v2_4 (Ba (None, 28, 28, 32)        128       \n",
      "_________________________________________________________________\n",
      "conv2d_9 (Conv2D)            (None, 28, 28, 16)        528       \n",
      "_________________________________________________________________\n",
      "batch_normalization_v2_5 (Ba (None, 28, 28, 16)        64        \n",
      "_________________________________________________________________\n",
      "max_pooling2d_4 (MaxPooling2 (None, 14, 14, 16)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_10 (Conv2D)           (None, 14, 14, 32)        4640      \n",
      "_________________________________________________________________\n",
      "batch_normalization_v2_6 (Ba (None, 14, 14, 32)        128       \n",
      "_________________________________________________________________\n",
      "conv2d_11 (Conv2D)           (None, 14, 14, 16)        528       \n",
      "_________________________________________________________________\n",
      "batch_normalization_v2_7 (Ba (None, 14, 14, 16)        64        \n",
      "_________________________________________________________________\n",
      "max_pooling2d_5 (MaxPooling2 (None, 7, 7, 16)          0         \n",
      "_________________________________________________________________\n",
      "flatten_2 (Flatten)          (None, 784)               0         \n",
      "_________________________________________________________________\n",
      "dense_4 (Dense)              (None, 32)                25120     \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 32)                0         \n",
      "_________________________________________________________________\n",
      "dense_5 (Dense)              (None, 10)                330       \n",
      "=================================================================\n",
      "Total params: 31,850\n",
      "Trainable params: 31,658\n",
      "Non-trainable params: 192\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "deep_model.compile(optimizer=keras.optimizers.Adam(),\n",
    "             loss=keras.losses.SparseCategoricalCrossentropy(),\n",
    "            metrics=['accuracy'])\n",
    "deep_model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 54000 samples, validate on 6000 samples\n",
      "Epoch 1/5\n",
      "54000/54000 [==============================] - 62s 1ms/sample - loss: 0.2729 - accuracy: 0.9147 - val_loss: 0.0657 - val_accuracy: 0.9818\n",
      "Epoch 2/5\n",
      "54000/54000 [==============================] - 63s 1ms/sample - loss: 0.0872 - accuracy: 0.9739 - val_loss: 0.0437 - val_accuracy: 0.9865\n",
      "Epoch 3/5\n",
      "54000/54000 [==============================] - 59s 1ms/sample - loss: 0.0657 - accuracy: 0.9800 - val_loss: 0.0404 - val_accuracy: 0.9890\n",
      "Epoch 4/5\n",
      "54000/54000 [==============================] - 49s 913us/sample - loss: 0.0535 - accuracy: 0.9834 - val_loss: 0.0622 - val_accuracy: 0.9830\n",
      "Epoch 5/5\n",
      "54000/54000 [==============================] - 49s 913us/sample - loss: 0.0441 - accuracy: 0.9860 - val_loss: 0.0435 - val_accuracy: 0.9892\n"
     ]
    }
   ],
   "source": [
    "history = deep_model.fit(x_train, y_train, batch_size=64, epochs=5, validation_split=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD8CAYAAACb4nSYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl0VfW99/H3N3NCRpIwJYGEQSEoY0QRkaHXPjgUFb1OrQU7cKui9j6rqxduV+2Vp116W++z7lPBeqliq7VaLq0t7cWqFRCpqAQZZCZMZmAIQ0ICmc/3+WPvJCchmBNIsk9yvq+1zso+e//2Od+z4XzO7/z2cERVMcYYExrCvC7AGGNM97HQN8aYEGKhb4wxIcRC3xhjQoiFvjHGhBALfWOMCSEW+sYYE0Is9I0xJoRY6BtjTAiJ8LqA1tLS0jQ7O9vrMowxpkfZvHnzSVVNb69d0IV+dnY2+fn5XpdhjDE9iogcCaSdDe8YY0wIsdA3xpgQElDoi8gsEdkrIgUisrCN5UNE5D0R2S4i60Qk02/Zv4vIDvd2b2cWb4wxpmPaHdMXkXBgKXATUARsEpFVqrrLr9mzwCuq+msRmQk8DTwoIrcCE4BxQDSwTkTeUtWzHSmyrq6OoqIiqqurO7KauYiYmBgyMzOJjIz0uhRjTDcLZEfuJKBAVQ8CiMgbwO2Af+jnAv/bnV4L/NFv/npVrQfqRWQ7MAtY0ZEii4qKSEhIIDs7GxHpyKqmFVXl1KlTFBUVkZOT43U5xphuFsjwTgZQ6He/yJ3nbxswx52+E0gQkVR3/iwRiRORNGAGkNXRIqurq0lNTbXA7wQiQmpqqn1rMiZEddaO3O8B00RkCzANKAYaVPUdYDXwIfA6sBFoaL2yiMwXkXwRyS8tLW3zCSzwO49tS2NCVyChX0zL3nmmO6+Jqpao6hxVHQ/8wJ1X5v79iaqOU9WbAAH2tX4CVV2mqnmqmpee3u65BcZ4o64KfD6vqzC9TUMdlGyBT34J+S93+dMFMqa/CRghIjk4YX8f8IB/A3fo5rSq+oBFwHJ3fjiQrKqnRGQMMAZ4pxPr7zZlZWX89re/5ZFHHunQerfccgu//e1vSU5OvmibJ598khtvvJF/+Id/uNwyTUf4fFB1Gs6VOrfKE3DupHvfb7pxft05iE6EQeMhYwJkTIRBEyBxENi3JxMIVSj7HIrzoWiz8/foNqh3h1szJ0HeQ11aQruhr6r1IrIAeBsIB5ar6k4RWQzkq+oqYDrwtIgosB541F09EvjAHU44C3zN3anb45SVlfH8889fEPr19fVERFx8M65evbrdx168ePFl12dcdVV+IV7aPO1/a5x//iRoGz13CYc+adAn3bll5bjTqVBeDMWb4cMl4Ktz2scPcD4AMsa7HwTjITale1+3CU7VZ6HkUyjKd/7fFOU7HQqA8GgYNA7yvgmZEyEjD5IHd3lJAV2GQVVX44zN+8970m96JbCyjfWqcY7g6fEWLlzIgQMHGDduHJGRkcTExJCSksKePXvYt28fd9xxB4WFhVRXV/PEE08wf/58oPmyEpWVldx8883ccMMNfPjhh2RkZPCnP/2J2NhY5s2bx2233cbdd99NdnY2c+fO5c9//jN1dXX893//NyNHjqS0tJQHHniAkpISJk+ezLvvvsvmzZtJS0vzeMt0MZ8Pqsv8etylbg/cb9p/fm1F248TFd8c5CnZkJnnTMf38wv4fs7f2BQIa2fks64aju9w3sjFnzp/9/5P8/K+w9wPAvcbwYCrITK20zaLCUIN9XBiV8tefOleQJ3lqcNh2Ezn/17GROh/FUREdXuZQXftnfY89eed7Crp0GH+7codlMiPvjL6C9s888wz7Nixg61bt7Ju3TpuvfVWduzY0XTY4/Lly+nbty9VVVVcc8013HXXXaSmprZ4jP379/P666/zy1/+knvuuYff//73fO1rX7vgudLS0vj00095/vnnefbZZ3nxxRd56qmnmDlzJosWLeKvf/0rL730UudtgO5WV+30stsbTmnsjfva+HIoYRCX2twbz5johnh687w+foEeFde5ryEyxnnzZuY1z6sqg6Nbmz8EDm+Az9yjk8MioF9uyw+C9JEQFt65dZnuU17sBrx7O7oV6s47y2L7Ov83Rs9xe/ETg+bbX48L/WAxadKkFse5//znP+fNN98EoLCwkP37918Q+jk5OYwbNw6AiRMncvjw4TYfe86cOU1t/vCHPwCwYcOGpsefNWsWKSnB8R8IcMYpq8u+YDjFP9xLoeYiH9oRsW5o94OkTOerb3w/vxD3u8X1Db7AjE2GodOdW6OzR52v943fCHb+ATa7O+si42DgOPdDwP0gSB5i+weCUU2ls7O1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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'valivation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 2s 196us/sample - loss: 0.0335 - accuracy: 0.9887\n"
     ]
    }
   ],
   "source": [
    "result = deep_model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
